PHLEGM v6 - NES v5 Presentation Restore - 2026-10-03

Scope
-----
NES/RP2C02 presentation only. Commodore, SNES, GUI, filters, sessions, audio,
compiler/bootstrap, and other v6 behavior are unchanged.

Regression
----------
The v6 device-frame-latch work moved NES rasterization behind WM_PAINT and made
normal refresh merely invalidate the display window. A continuously-running NES
VM could starve the Windows paint queue; frameNumber then advanced only when a
paint message happened to arrive. This produced observed rates around 0.15 FPS
while the older v5 path had remained responsive.

Fix
---
* Keep NativePpuLatchCompletedFrame() as the O(1) vblank/pre-NMI register latch.
* Restore NES rasterization to MachineServiceVideoRefresh() through
  MachineLatchDisplayFrame(), before presentation.
* Make MachinePaintDisplay() presentation-only; it no longer creates NES frames.
* For NES only, MachinePresentDisplayNow() calls UpdateWindow() after invalidation,
  matching the proven v5 immediate-presentation contract once the frame is built.
* Retain the v6 FPS overlay and all unrelated v6 features.

Invariant
---------
The emulated PPU vblank path performs no full-frame rasterization or bulk memory
snapshot. The host refresh builds the frame from the lightweight pre-NMI register
latch plus observational PPU memory reads; WM_PAINT never gates NES frame
production.
